package com.wcj.stack.dfs;

import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;

/**
 * 给定一个二叉树的根节点 root ，返回 它的 中序 遍历 。
 * 输入：root = [1,null,2,3]
 * 输出：[1,3,2]
 */
public class 二叉树的中序遍历 {


    /**
     * 递归方式
     * @param root
     * @return
     */
    public List<Integer> inorderTraversal(TreeNode root) {
        ArrayList<Integer> integers = new ArrayList<>();
        inorder(root,integers);
        return integers;
    }

    private void inorder(TreeNode root, ArrayList<Integer> integers) {
        if (root == null){
            return;
        }
        inorder(root.left,integers);
        integers.add(root.val);
        inorder(root.right,integers);
    }

    /**
     * 迭代方式
     * @param root
     * @return
     */
    public List<Integer> inorderTraversal2(TreeNode root) {
        ArrayList<Integer> integers = new ArrayList<>();
        Deque<TreeNode> stack = new LinkedList<>();
        while (root != null || !stack.isEmpty()){
            while (root != null){
                stack.push(root);
                root = root.left;
            }
            root = stack.pop();
            integers.add(root.val);
            root = root.right;
        }
        return integers;
    }

}
